package com.ruoyi.common.office;

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hslf.usermodel.HSLFSlide;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.List;

@Slf4j
public class ConvertPPTXFromLocalPath {

    // 中文字体名称（确保运行环境存在该字体，如 "SimSun" 宋体、"Microsoft YaHei" 微软雅黑）
    private static final String CHINESE_FONT_NAME = "SimSun";

    /**
     * 将 PPT/PPTX 转换为图片
     * @param pptPath   PPT 文件路径
     * @param outputDir 图片输出目录
     * @param format    图片格式（如 "png"、"jpg"）
     */
    public static void convert(String pptPath, String outputDir, String format,String fileName) throws Exception {
        // 创建输出目录
        File dir = new File(outputDir);
        if (!dir.exists()) {
            boolean mkdir = dir.mkdirs();
            if (!mkdir){
                return;
            }
        }

        File pptFile = new File(pptPath);
        if (!pptFile.exists()) {
            throw new FileNotFoundException("PPT 文件不存在：" + pptPath);
        }

        // 根据文件后缀判断 PPT 类型
        if (pptPath.toLowerCase().endsWith(".pptx")) {
            convertPptx(pptPath, outputDir, format,fileName);
        } else if (pptPath.toLowerCase().endsWith(".ppt")) {
            convertPpt(pptPath, outputDir, format);
        } else {
            throw new IllegalArgumentException("不支持的文件格式：" + pptPath);
        }
    }

    /**
     * 处理 .pptx 格式
     */
    private static void convertPptx(String pptxPath, String outputDir, String format,String fileName) throws Exception {
        try (FileInputStream fis = new FileInputStream(pptxPath);
             XMLSlideShow ppt = new XMLSlideShow(fis)) {

            // 获取幻灯片尺寸（宽 x 高）
            Dimension pageSize = ppt.getPageSize();
            List<XSLFSlide> slides = ppt.getSlides();

            log.info("当前path:{}的ppt生成的图片数量:{}", pptxPath, slides.size());

            // 遍历幻灯片并渲染
            for (int i = 0; i < slides.size(); i++) {
                XSLFSlide slide = slides.get(i);
                // 创建与幻灯片尺寸相同的 BufferedImage
                BufferedImage img = new BufferedImage(
                        pageSize.width, pageSize.height, BufferedImage.TYPE_INT_RGB);
                Graphics2D g = img.createGraphics();

                // 填充背景色（白色）
                g.setPaint(Color.WHITE);
                g.fill(new Rectangle2D.Float(0, 0, pageSize.width, pageSize.height));
                g.setFont(new Font(CHINESE_FONT_NAME, Font.PLAIN, 12));

                // 渲染幻灯片内容到图片
                slide.draw(g);

                // 释放资源
                g.dispose();

                // 保存图片
                String imgPath = outputDir + File.separator + fileName + (i + 1) + "." + format;
                ImageIO.write(img, format, new File(imgPath));
                log.info("保存图片:{}在路径下:{}", imgPath, outputDir);
            }
        }
    }

    /**
     * 处理 .ppt 格式
     */
    private static void convertPpt(String pptPath, String outputDir, String format) throws Exception {
        try (FileInputStream fis = new FileInputStream(pptPath);
             HSLFSlideShow ppt = new HSLFSlideShow(fis)) {

            // 获取幻灯片尺寸
            Dimension pageSize = ppt.getPageSize();
            List<HSLFSlide> slides = ppt.getSlides();

            // 遍历幻灯片并渲染
            for (int i = 0; i < slides.size(); i++) {
                HSLFSlide slide = slides.get(i);
                BufferedImage img = new BufferedImage(
                        pageSize.width, pageSize.height, BufferedImage.TYPE_INT_RGB);
                Graphics2D g = img.createGraphics();

                // 填充背景
                g.setPaint(Color.WHITE);
                g.fill(new Rectangle2D.Float(0, 0, pageSize.width, pageSize.height));
                g.setFont(new Font(CHINESE_FONT_NAME, Font.PLAIN, 12));
                // 渲染幻灯片
                slide.draw(g);

                g.dispose();

                // 保存图片
                String imgPath = outputDir + File.separator + "slide_" + (i + 1) + "." + format;
                ImageIO.write(img, format, new File(imgPath));
                System.out.println("生成图片：" + imgPath);
            }
        }
    }
}
